bitkeeper revision 1.1108.1.1 (40fbb559J4VKc_p9h4f2N4LDV9IXfg)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Mon, 19 Jul 2004 11:49:45 +0000 (11:49 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Mon, 19 Jul 2004 11:49:45 +0000 (11:49 +0000)
Fix problems with persistence of vm startTime.

tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendDomainInfo.py

index 51d52f1acc3b43f96041e17629f58e73b61a6da4..eca6ab5a0f33bf8be2cca2de478bb1485a403bb6 100644 (file)
@@ -179,8 +179,7 @@ class XendDomain:
         @param info:      domain info from xen
         @return: deferred
         """
-        config = sxp.child_value(savedinfo, 'config')
-        deferred = XendDomainInfo.vm_recreate(config, info)
+        deferred = XendDomainInfo.vm_recreate(savedinfo, info)
         def fn(dominfo):
             self.domain[dominfo.id] = dominfo
         deferred.addCallback(fn)
@@ -249,20 +248,30 @@ class XendDomain:
             id = str(d['dom'])
             doms[id] = d
             if id not in self.domain:
-                config = None
-                deferred = XendDomainInfo.vm_recreate(config, d)
+                savedinfo = None
+                deferred = XendDomainInfo.vm_recreate(savedinfo, d)
                 def fn(dominfo):
                     self._add_domain(dominfo.id, dominfo)
                 deferred.addCallback(fn)
         # Remove entries for domains that no longer exist.
         for d in self.domain.values():
-            dominfo = doms.get(d.id)
-            if dominfo:
-                d.update(dominfo)
+            info = doms.get(d.id)
+            if info:
+                d.update(info)
             else:
                 self._delete_domain(d.id)
         self.reap_schedule(1)
 
+    def update_domain(self, id):
+        """Update the saved info for a domain.
+
+        @param id: domain id
+        """
+        dominfo = self.domain.get(id)
+        if dominfo:
+            self.domain_db[id] = dominfo.sxpr()
+            self.sync_domain(id)
+
     def refresh_domain(self, id):
         """Refresh information for a single domain.
 
@@ -580,7 +589,9 @@ class XendDomain:
         if not dominfo:
             raise XendError("invalid domain:" + str(dom))
         self.refresh_schedule()
-        return dominfo.device_create(devconfig)
+        val = dominfo.device_create(devconfig)
+        self.update_domain(dominfo.id)
+        return val
 
     def domain_device_destroy(self, dom, type, idx):
         """Destroy a device.
@@ -594,7 +605,9 @@ class XendDomain:
         if not dominfo:
             raise XendError("invalid domain:" + str(dom))
         self.refresh_schedule()
-        return dominfo.device_destroy(type, idx)
+        val = dominfo.device_destroy(type, idx)
+        self.update_domain(dominfo.id)
+        return val
 
     def domain_devtype_ls(self, dom, type):
         """Get list of device indexes for a domain.
index 47b945f200fa8bc635d276659ae3f628934c1bd7..eb36c047d91f2539196cddf57a76499bede4d0b4 100644 (file)
@@ -253,14 +253,24 @@ def vm_create(config):
     vm = XendDomainInfo()
     return vm.construct(config)
 
-def vm_recreate(config, info):
+def vm_recreate(savedinfo, info):
     """Create the VM object for an existing domain.
+
+    @param savedinfo: saved info from the domain DB
+    @type  savedinfo: sxpr
+    @param info:      domain info from xc
+    @type  info:      xc domain dict
+    @return: deferred
     """
     vm = XendDomainInfo()
     vm.recreate = 1
     vm.setdom(info['dom'])
     vm.name = info['name']
     vm.memory = info['mem_kb']/1024
+    start_time = sxp.child_value(savedinfo, 'start_time')
+    if start_time is not None:
+        vm.startTime = float(start_time)
+    config = sxp.child_value(savedinfo, 'config')
     if config:
         d = vm.construct(config)
     else:
@@ -382,6 +392,7 @@ class XendDomainInfo:
                 ['id', self.id],
                 ['name', self.name],
                 ['memory', self.memory] ]
+
         if self.info:
             run   = (self.info['running'] and 'r') or '-'
             block = (self.info['blocked'] and 'b') or '-'
@@ -396,10 +407,10 @@ class XendDomainInfo:
             sxpr.append(['cpu', self.info['cpu']])
             sxpr.append(['cpu_time', self.info['cpu_time']/1e9])    
             
-            if self.startTime:
-                upTime =  time.time() - self.startTime  
-                sxpr.append(['up_time', str( upTime ) ] )
-                sxpr.append(['start_time', str( self.startTime ) ] )
+        if self.startTime:
+            upTime =  time.time() - self.startTime  
+            sxpr.append(['up_time', str(upTime) ])
+            sxpr.append(['start_time', str(self.startTime) ])
 
         if self.console:
             sxpr.append(self.console.sxpr())
@@ -418,9 +429,6 @@ class XendDomainInfo:
             if self.memory is None:
                 raise VmError('missing memory size')
 
-            if sxp.child_value( config, 'start_time' ) != None:
-                self.startTime = float( sxp.child_value( config, 'start_time' ) )
-
             self.configure_console()
             self.configure_restart()
             self.configure_backends()
@@ -598,7 +606,7 @@ class XendDomainInfo:
                           % (name, memory))
         self.setdom(dom)
 
-        if self.startTime == None:
+        if self.startTime is None:
             self.startTime = time.time()
 
     def build_domain(self, ostype, kernel, ramdisk, cmdline, vifs_n):